package com.system.service;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.frame.ar.db.QueryParamsAnd;
import com.frame.ar.kit.ObjKit;
import com.frame.ar.model.BJUIPager;
import com.frame.jfinal.service.BaseService;
import com.frame.util.MapUtil;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.kit.JsonKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.system.model.Argument;
import com.system.model.FunctionMenu;

/*******************************************
 * 作用描述：资源管理服务层
 ******************************************* 
 * @author LRC
 * @createDate 2015-9-12
 * @version v1.0
 * @updateRecord 格式：时间，作者，修改说明
 ******************************************* 
 * 
 */
public class ResourceService extends BaseService {

	/*******************************************
	 * 功能描述：获取树形节点格式的数据
	 ******************************************* 
	 * @createDate 2015-9-12 by LRC
	 * @return
	 * @updateRecord 格式：时间，作者，修改说明
	 ******************************************* 
	 * 
	 */
	public static List<Map<String, Object>> getMenuTree() {
		QueryParamsAnd qr = new QueryParamsAnd(0);
		qr.setTableName(FunctionMenu.dao.getTableName())
		  .setSelectColumn("id,id tId,parentId pId,name,icon faicon,url,remark")
		  .setOrder("menuLevel,orderSn");
		List<Record> menus = Db.find(qr.getQueryString());
		// 第一个为根节点，默认展开
		menus.get(0).set("open", true);
		return MapUtil.getMapListFromRecord(menus);
	}

	/*******************************************
	 * 功能描述：菜单树节点移动，开启事务
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param c
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	@Before(Tx.class)
	public static boolean moveMenuTree(Controller c) {
		String moveType = c.getPara("moveType");
		if (moveType == null)
			return false;
		Integer moveId = c.getParaToInt("moveId");
		Integer targetId = c.getParaToInt("targetId");
		String idPath = null;//节点id路径索引变更
		Integer sn = null;//节点序号变更
		//获取目标节点信息
		FunctionMenu targetMenu = FunctionMenu.dao.findById(targetId);
		//获取更新的节点信息
		FunctionMenu menu = FunctionMenu.dao.findById(moveId);
		//获取旧的父节点ID
		Integer lastPid = menu.getInt("parentId");
		boolean result;
		switch (moveType) {
			case "inner":
				// 根父节点，并且变为最后一个节点
				menu.set("parentId",targetId);
				menu.set("idPath",targetMenu.getStr("idPath")+"-"+moveId);
				menu.set("menuLevel",targetMenu.getInt("menuLevel")+1);
				sn = Db.queryInt("select max(NULLIF(orderSn,0))+1 sn from sys_base_menu where parentId=?", targetId);
				menu.set("orderSn", sn);
				result=menu.update();
				break;
			case "prev":
				// 成为同级前一个节点
				menu.set("parentId",targetMenu.getInt("parentId"));
				idPath = targetMenu.getStr("idPath");
				System.out.println(idPath.lastIndexOf("-"));
				if(idPath.lastIndexOf("-")>0)
					idPath = idPath.substring(0,idPath.lastIndexOf("-"))+"-"+moveId;
				else
					idPath = ""+moveId;
				menu.set("idPath",idPath);
				menu.set("menuLevel",targetMenu.getInt("menuLevel"));
				menu.set("orderSn", targetMenu.getInt("orderSn")-1);
				result=menu.update();
				break;
			case "next":
				// 成为同级前一个节点
				menu.set("parentId",targetMenu.getInt("parentId"));
				idPath = targetMenu.getStr("idPath");
				if(idPath.lastIndexOf("-")>0)
					idPath = idPath.substring(0,idPath.lastIndexOf("-"))+"-"+moveId;
				else
					idPath = ""+moveId;
				menu.set("idPath",idPath);
				menu.set("menuLevel",targetMenu.getInt("menuLevel"));
				menu.set("orderSn", targetMenu.getInt("orderSn")+1);
				result=menu.update();
				break;
			default:
				return false;
		}
		//更改子节点的idPath和菜单层级
		Integer subMenuLevel =  menu.getInt("menuLevel") + 1;
		Db.update("update sys_base_menu set idPath=CONCAT(?,'-',id),menuLevel=? where parentId=?", idPath,subMenuLevel,moveId);
		//更改原父节点叶子状态
		//判断父节点是否还有子节点
		Integer n = FunctionMenu.dao.getChildrenNum(lastPid);
		if(n>0)return true;
		//更改父节点是否为叶子状态
		FunctionMenu pmenu = FunctionMenu.dao.findById(lastPid);
		pmenu.set("isLeaf", "T");
		return pmenu.update();		
	}

	/*******************************************
	 * 功能描述：保存菜单，带事务处理
	 *******************************************
	 * @createDate 2015-9-12 by LRC
	 * @param c
	 * @return 返回菜单ID
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static Integer saveMenu(Controller c) {
		// 获取menu对象
		String menuInfo = c.getPara("menuInfo");
		if (menuInfo != null && !"".equals(menuInfo)) {
			JSONObject obj = JSONObject.fromObject(menuInfo);
			String[] args = { "name", "url", "icon:faicon", "remark" };
			// 根据id判断是否更新还是新增
			final FunctionMenu menu = new FunctionMenu();
			MapUtil.copyToModel(obj, menu, args);
			if (ObjKit.isNull(obj.get("id"))) {
				//新增菜单
				//获取父节点
				Object parentId = obj.get("pId");
				final FunctionMenu pmenu = FunctionMenu.dao.findById(parentId);
				menu.set("parentId", parentId);
				//设置菜单层级
				menu.set("menuLevel",pmenu.getInt("menuLevel")+1);
				//获取最大的序号
				menu.set("orderSn", FunctionMenu.dao.getMaxOrderSnByParentId(parentId)+1);
				//初始化作为叶子功能
				menu.set("isLeaf", "T");
				boolean rs = Db.tx(new IAtom() {
					@Override
					public boolean run() throws SQLException {
						boolean r1 = menu.save();
						//设置菜单的idpath
						if(r1)
							menu.set("idPath", pmenu.getStr("idPath")+"-"+menu.getInt("id"));
						else
							return false;
						
						r1 = menu.update();
						
						if(r1){
							//修改父节点为非叶子
							pmenu.set("isLeaf", "F");
							return pmenu.update();
						}else{
							return false;
						}
					}
				});
				return rs ? menu.getInt("id") : null;
			} else {
				menu.set("id", obj.get("id"));
				return menu.update() ? menu.getInt("id") : null;
			}
		} else {
			return null;
		}
	}

	/*******************************************
	 * 功能描述：删除菜单
	 ******************************************* 
	 * @createDate 2015-9-12 by LRC
	 * @return
	 * @updateRecord 格式：时间，作者，修改说明
	 ******************************************* 
	 * 
	 */
	public static boolean delMenu(final Object id) {
		if(ObjKit.isNull(id))return true;
		//判断是否有子节点
		Integer n = FunctionMenu.dao.getChildrenNum(id);
		if(n>0)return false;
		return Db.tx(new IAtom() {
			@Override
			public boolean run() throws SQLException {
				FunctionMenu menu = FunctionMenu.dao.findById(id);
				//获取父节点ID
				Integer pid = menu.getInt("parentId");
				//删除节点
				boolean r = menu.delete();
				if(!r)return false;
				//判断父节点是否还有子节点
				Integer n = FunctionMenu.dao.getChildrenNum(pid);
				if(n>0)return true;
				//更改父节点是否为叶子状态
				FunctionMenu pmenu = FunctionMenu.dao.findById(pid);
				pmenu.set("isLeaf", "T");
				return pmenu.update();
			}
		});
	}

	/*******************************************
	 * 功能描述：获取参数树
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param id 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static List<Map<String, Object>> getArgTree(Object id) {
		QueryParamsAnd qr = new QueryParamsAnd();
		qr.setTableName(Argument.dao.getTableName())
		  .setSelectColumn("id,id tId,superId pId,argName name,argCode")
		  .setOrder("id");
		if(id!=null){
			qr.put("superId", "=", id);
		}
		qr.put("isLeaf", "=", "false");
		List<Record> menus = Db.find(qr.getQueryString(),qr.getValue());
		// 第一个为根节点，默认展开
		menus.get(0).set("open", true);
		return MapUtil.getMapListFromRecord(menus);
	}
	
	/*******************************************
	 * 功能描述：分页查询参数信息
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param pager
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static BJUIPager findArgByPage(BJUIPager pager){
		// 获取分页参数
		Integer pageSize = pager.getPageSize();
		Integer pageIndex = pager.getPageCurrent();
		// 设置默认值
		pager.setOrderDefaultValue("orderid");
		String from = pager.getQr().getQueryString("from sys_base_arg");
		// 查询用户列表
		Page<Record> args = Db.paginate(pageIndex, pageSize, "select * ",
				from, pager.getQr().getValue());
		pager.fillPageData(args,10);
		return pager;
	}

	/*******************************************
	 * 功能描述：通过父id查询参数信息
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param pid
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static List<Argument> findArgList(Object pid) {
		if(ObjKit.isNull(pid))return null;
		QueryParamsAnd qr = new QueryParamsAnd(1);
		qr.put("superId", "=", pid)
		  .setOrder("orderid");
		List<Argument> list = Argument.dao.findByQueryParams(qr);
		return list;
	}
	
	/*******************************************
	 * 功能描述：
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param c
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean saveDataGridArgument(Controller c){
		JSONArray arr = JSONArray.fromObject(c.getPara("json"));
		Object superId = c.getPara("superId");
		for(int i=0; i<arr.size(); i++){
			JSONObject obj = arr.getJSONObject(i);
			//获取数据ID
			Object id = obj.get("id");
			Argument a = new Argument();
			if(ObjKit.isNull(id)){
				//执行新增操作
				//获取父节点信息
				Argument pr = Argument.dao.findById(superId);
				a.set("superId",superId)
				 .set("insertTime", new Date())
				 .set("superArgCode", pr.get("argCode"))
				 .set("argCode", obj.get("argCode"))
				 .set("argName", obj.get("argName"))
				 .set("content", obj.get("content"))
				 .set("orderid", ObjKit.parseToInt(obj.get("orderid"),99))
				 //默认是叶子
				 .set("isLeaf", ObjKit.parseToStr(obj.get("isLeaf"),"true"))
				 .set("remark", obj.get("remark"));
				a.save();
				a.set("idPath",pr.getStr("idPath")+"-"+a.getInt("id"));
				a.update();
			}else{
				//执行更新操作
				a.set("id", id)
				 .set("argCode", obj.get("argCode"))
				 .set("argName", obj.get("argName"))
				 .set("content", obj.get("content"))
				 .set("orderid", ObjKit.parseToInt(obj.get("orderid"),99))
				 .set("isLeaf", ObjKit.parseToStr(obj.get("isLeaf"),"true"))
				 .set("remark", obj.get("remark"));
				a.update();
			}
		}
		
		
		return true;
	}

	/*******************************************
	 * 功能描述：数据列表删除操作
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param c
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean delDataGridArgument(Controller c) {
		JSONArray arr = JSONArray.fromObject(c.getPara("json"));
		for(int i=0; i<arr.size(); i++){
			JSONObject obj = arr.getJSONObject(i);
			Object id = obj.get("id");
			//判断是否还有子节点
			Integer cn = Argument.dao.getChildrenNum(id);
			if(cn>0)return false;
			Argument.dao.deleteById(id);
		}
		return true;
	}
	/*******************************************
	 * 功能描述：获得回收站菜单树
	 *******************************************
	 * @createDate 2015-9-15 by LRC
	 * @param id
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static List<Map<String, Object>> getTrashTree() {
		QueryParamsAnd qr = new QueryParamsAnd();
		qr.setTableName(Argument.dao.getTableName())
		  .setSelectColumn("id,id tId,superId pId,argName name,argCode,content url")
		  .setOrder("id");
		//回收站idPath 1-47-73
		qr.put("idPath", "like", "1-47-73%");
		List<Record> menus = Db.find(qr.getQueryString(),qr.getValue());
		// 第一个为根节点，默认展开
		menus.get(0).set("open", true);
		return MapUtil.getMapListFromRecord(menus);
	}
}
